#include "head.h"
#define COLOR_CYAN    "\x1b[36m"  // 青蓝色
#define COLOR_RESET   "\x1b[0m"   // 默认颜色
#define COLOR_YELLOW  "\x1b[33m"  // 黄色
int printVersion(void) {
    printf("%s                     _   %s\n", COLOR_CYAN, COLOR_RESET);
    printf("%s  ___ _ __ ___  __ _| |_ %s\n", COLOR_CYAN, COLOR_RESET);
    printf("%s / __| '__/ _ \\/ _` | __|%s\n", COLOR_CYAN, COLOR_RESET);
    printf("%s| (__| | |  __/ (_| | |_ %s\n", COLOR_CYAN, COLOR_RESET);
    printf("%s \\___|_|  \\___|\\__,_|\\__|%s", COLOR_CYAN, COLOR_RESET);
    printf("%s  version 3.5.0%s\n", COLOR_YELLOW, COLOR_RESET);

    return 0;
}

void remove_first_token(char *str) {
    // Find the end position of the first token
    int len = strlen(str);
    int i = 0;
    for (; i < len; i++) {
        if (str[i] == ' ') {
            break;
        }
    }
    // Find the index of the first non-space character after the first token
    for (; i < len; i++) {
        if (str[i] != ' ') {
            break;
        }
    }
    // Shift the remaining characters to the left
    int j = 0;
    for (; i < len - 1; i++) {
        str[j++] = str[i];
    }
    // 这里已经把最后的换行符给移除了
    str[j++] = '\0';
    str[j] = '\0';
}
 int trantoNum(char *p,int *num) {
     // int length_p = strlen(p);
     // puts(p);
     // p[length_p - 1] = '\0';
     // printf("length_p = %d\n", length_p);
     // memcmp(const void *s1, const void *s2, size_t n);
     if (strcmp(p, "cd") == 0) {
         *num = 0;
     } else if (strcmp(p, "ls") == 0){
         *num = 1;
     } else if (strcmp(p, "puts") == 0) {
         *num = 2;
     } else if (strcmp(p, "gets") == 0) {
         *num = 3;
     } else if (strcmp(p, "remove") == 0) {
         *num = 4;
     } else if (strcmp(p, "pwd") == 0) {
         *num = 5;
     } else if (strcmp(p, "mkdir") == 0) {
         *num = 6;
     } else if (strcmp(p, "rmdir") == 0) {
         *num = 7;
     } else if (strcmp(p, "quit") == 0) {
         *num = 8;
     }
     return 0;
 }

// int trantoNum(char *p) {
//     int num = 1000;
//     char prefix[6];  // 存储字符串前缀
//     sscanf(p, "%5s", prefix);  // 将参数字符串中的前五个字符读入prefix中（保证prefix以'\0’结尾）
//
//     puts(prefix);
//     if (strcmp(prefix, "cd") == 0) {
//         num = 0;
//     } else if (strcmp(prefix, "ls") == 0){
//         num = 8;   // 将操作类型8放在第2个位置
//     } else if (strcmp(prefix, "puts") == 0) {
//         num = 2;
//     } else if (strcmp(prefix, "gets") == 0) {
//         num = 3;
//     } else if (strcmp(prefix, "remove") == 0) {
//         num = 4;
//     } else if (strcmp(prefix, "pwd") == 0) {
//         num = 5;
//     } else if (strcmp(prefix, "mkdir") == 0) {
//         num = 6;
//     } else if (strcmp(prefix, "rmdir") == 0) {
//         num = 7;
//     }
//     return num;
// }
//
int removeLeadingSpaces(char* str) {
    int i = 0, j = 0;
    while (str[i] == ' ') {
        i++;
    }
    if (i > 0) {
        while (str[i] != '\0') {
            str[j] = str[i];
            i++;
            j++;
        }
        str[j] = '\0';
        return 1; // 返回 1 表示成功删除空格
    }
    return 0; // 返回 0 表示没有空格可以删除
}
int main(int argc, char* argv[])
{
    system("clear");
    // ./client ip port
    ARGS_CHECK(argc, 3);
    int sockfd;
    tcpInit(&sockfd,argv[1],argv[2]);
    printVersion();

    int ret_num = loginFunc(sockfd);
    if (ret_num == -1) return 0;

    train_t train_command;

    while (1) {
        // pwd
        // client info
        printf("\n:");
        // fflush(stdout);
        // printf("this way sir\n");
        print_network_message(sockfd);
        // printf("i am here\n");
        printf("$ ");
        // 刷出输出缓冲区
        // 注意所有的输出，看看有没有刷出内容
        fflush(stdout);

        // scanf
        // strtoken
        bzero(&train_command, sizeof(train_command));
        fgets(train_command.data, 4096, stdin);

        // 这里是在是太关键了
        removeLeadingSpaces(train_command.data);
        train_command.data[strlen(train_command.data) - 1] = ' ';
        train_command.data[strlen(train_command.data)] = ' ';
        // puts(train_command.data);
        char temp_data[4096];
        strcpy(temp_data, train_command.data);
        char *token;
        token = strtok(temp_data, " ");
        // puts(token);
        char fxxxk[1024];
        strcpy(fxxxk, token);
        remove_first_token(train_command.data);

        train_command.length = strlen(train_command.data);

        // 文件名顺便获取
        char filename[256];
        char *filename_start = strrchr(train_command.data, '/');
        if (filename_start != NULL) { // 如果发现'/'，则文件名为'/'之后的内容
            filename_start++; // 跳过'/'，指向文件名的起始位置
        } else {
            filename_start = train_command.data; // 否则整个字符串都是文件名
        }

        strcpy(filename, filename_start); // 复制文件名到新的字符数组中
        filename[strlen(filename) - 1] = '\0';

        int comType = 999;
        trantoNum(fxxxk, &comType);
           // char *str0 = "cd";
           // char *str1 = "ls";
           // char *str2 = "puts";
           // char *str3 = "gets";
           // char *str4 = "remove";
           // char *str5 = "pwd";
           // char *str6 = "mkdir";
           // char *str7 = "rmdir";
           // char *str8 = "quit";


           // int comType;
           // if (strcmp(token, str0) == 0) {
           // comType = 0;
           // } else if (strcmp(token, str1) == 0) {
           // comType = 1;
           // } else if (strcmp(token, str2) == 0) {
           // comType = 2;
           // } else if (strcmp(token, str3) == 0) {
           // comType = 3;
           // } else if (strcmp(token, str4) == 0) {
           // comType = 4;
           // } else if (strcmp(token, str5) == 0) {
           // comType = 5;
           // } else if (strcmp(token, str6) == 0) {
           // comType = 6;
           // } else if (strcmp(token, str7) == 0) {
           // comType = 7;
           // } else if (strcmp(token, str8) == 0) {
           // comType = 8;
           // }
           // else {
           // comType = -1;
           // }

        // char *commands[][2] = {
        //     {"cd", "0"},
        //     {"ls", "1"},
        //     {"puts", "2"},
        //     {"gets", "3"},
        //     {"remove", "4"},
        //     {"pwd", "5"},
        //     {"mkdir", "6"},
        //     {"rmdir", "7"},
        //     {"quit", "8"}
        // };

        // int comType = -1;
        // for (int i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) {
        //     if (strcmp(token, commands[i][0]) == 0) {
        //         comType = atoi(commands[i][1]);
        //         break;
        //     }
        // }
        // comType = 8;
        send(sockfd, &comType, sizeof(int), 0);
        send(sockfd,&train_command,sizeof(train_command.length)+train_command.length,0);

        // 注意什么时候需要非阻塞的send
        int ifError;
        // comType = 8;
        switch (comType) {
        case 0:
            // 什么都没做
            cdFunc(sockfd);
            break;
        case 1:
            lsFunc(sockfd);
            break;
        case 2:
            putsFunc(sockfd, filename);
            break;
        case 3:
            printf("filename = %s\n", filename);
            // 这里先接收一个整数表示是否是报错信息
            getsFunc(sockfd, filename);
            break;
        case 4:
            removeFunc(sockfd);
            break;
        case 5:
            pwdFunc(sockfd);
            break;
        case 6:
            mkdirFunc(sockfd);
            break;
        case 7:
            rmdirFunc(sockfd);
            break;
        case 8:
            recv(sockfd, &ifError, sizeof(int), 0);
            return 0;
        default:
            recv(sockfd, &ifError, sizeof(int), 0);
            printf("No command found!\n");
        }
        // if (comType != -1) {

        //     int ifError;
        //     recv(sockfd, &ifError, sizeof(int), 0);
        //     if (ifError != 0) {
        //         // 接收一个小火车
        //         print_network_message(sockfd);
        //     }
        // }
    }

    close(sockfd);

    return 0;
}
